import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from tqdm.notebook import tqdm
from sklearn.preprocessing import MinMaxScaler,StandardScaler
import warnings
import random
warnings.filterwarnings('ignore')
%matplotlib inline
import torch
from torch import nn,optim
import torch.nn.functional as F
from torch.autograd import Variable
from torch.utils.data import Dataset,DataLoader
device=torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
seed=42
random.seed(42)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.backends.cudnn.deterministic = True
df=pd.read_csv('Port Harcourt, Nigeria (4.80678 7.002953).csv')
df.head(5)
| created_at | entry_id | Temperature_F | Humidity_% | PM2.5_ATM_ug/m3 | |
|---|---|---|---|---|---|
| 0 | 2021-07-26 16:45:59 UTC | 198 | 89 | 50 | 40.78 |
| 1 | 2021-07-26 16:48:03 UTC | 199 | 89 | 50 | 40.09 |
| 2 | 2021-07-26 16:49:59 UTC | 200 | 89 | 50 | 37.93 |
| 3 | 2021-07-26 16:54:03 UTC | 201 | 89 | 50 | 33.18 |
| 4 | 2021-07-26 16:55:59 UTC | 202 | 89 | 50 | 37.84 |
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 56052 entries, 0 to 56051 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 created_at 56052 non-null object 1 entry_id 56052 non-null int64 2 Temperature_F 56052 non-null int64 3 Humidity_% 56052 non-null int64 4 PM2.5_ATM_ug/m3 56052 non-null float64 dtypes: float64(1), int64(3), object(1) memory usage: 2.1+ MB
df.isnull().sum()
created_at 0 entry_id 0 Temperature_F 0 Humidity_% 0 PM2.5_ATM_ug/m3 0 dtype: int64
df.drop(columns='entry_id',inplace=True)
df['created_at']=pd.to_datetime(df['created_at'])
df.set_index('created_at',inplace=True)
df.sort_index(inplace=True)
# TimeStamp
df.index.unique()
DatetimeIndex(['2021-07-26 16:45:59+00:00', '2021-07-26 16:48:03+00:00',
'2021-07-26 16:49:59+00:00', '2021-07-26 16:54:03+00:00',
'2021-07-26 16:55:59+00:00', '2021-07-26 16:58:11+00:00',
'2021-07-26 17:00:08+00:00', '2021-07-26 17:02:05+00:00',
'2021-07-26 17:04:02+00:00', '2021-07-26 17:06:00+00:00',
...
'2021-10-25 09:18:40+00:00', '2021-10-25 09:20:40+00:00',
'2021-10-25 09:22:42+00:00', '2021-10-25 09:24:44+00:00',
'2021-10-25 09:26:47+00:00', '2021-10-25 09:28:43+00:00',
'2021-10-25 09:30:43+00:00', '2021-10-25 09:32:44+00:00',
'2021-10-25 09:34:44+00:00', '2021-10-25 09:36:44+00:00'],
dtype='datetime64[ns, UTC]', name='created_at', length=56052, freq=None)
df.head(5)
| Temperature_F | Humidity_% | PM2.5_ATM_ug/m3 | |
|---|---|---|---|
| created_at | |||
| 2021-07-26 16:45:59+00:00 | 89 | 50 | 40.78 |
| 2021-07-26 16:48:03+00:00 | 89 | 50 | 40.09 |
| 2021-07-26 16:49:59+00:00 | 89 | 50 | 37.93 |
| 2021-07-26 16:54:03+00:00 | 89 | 50 | 33.18 |
| 2021-07-26 16:55:59+00:00 | 89 | 50 | 37.84 |
df.groupby(['Temperature_F','Humidity_%'])['PM2.5_ATM_ug/m3'].mean().plot()
<AxesSubplot:xlabel='Temperature_F,Humidity_%'>
It indicates the previous value relationship with current value at different time Interval
df_acf=[]
for lag in range(0,31):
df_acf.append(df['PM2.5_ATM_ug/m3'].autocorr(lag))
plt.plot(np.arange(0,31),df_acf)
[<matplotlib.lines.Line2D at 0x19893c9d5b0>]
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
plt.figure(figsize=(5.5, 5.5))
plot_pacf(df['PM2.5_ATM_ug/m3'], lags=20)
<Figure size 396x396 with 0 Axes>
plt.figure(figsize=(5.5, 5.5))
plot_acf(df['PM2.5_ATM_ug/m3'], lags=20)
<Figure size 396x396 with 0 Axes>
daily_df=df['PM2.5_ATM_ug/m3'].resample('D')
daily_mean=daily_df.mean()
fig = plt.figure(figsize=(5.5, 5.5))
ax = fig.add_subplot(1,1,1)
df['PM2.5_ATM_ug/m3'].plot(ax=ax, color='b')
daily_mean.plot(ax=ax, color='r')
ax.set_title('By Minutely (blue) & Daily Mean (red)')
ax.set_xlabel('2020 Year record')
ax.set_ylabel('Particulate Matter PM2.5');
from statsmodels.tsa import stattools
adf_result = stattools.adfuller(df['PM2.5_ATM_ug/m3'], autolag='AIC')
print(f'ADF Statistic: {adf_result[0]}')
print(f'n_lags: {adf_result[1]}')
print(f'p-value: {adf_result[1]}')
for key, value in adf_result[4].items():
print('Critial Values:')
print(f' {key}, {value}')
ADF Statistic: -15.79513507741763 n_lags: 1.090499607855049e-28 p-value: 1.090499607855049e-28 Critial Values: 1%, -3.4304667952532175 Critial Values: 5%, -2.8615916212250094 Critial Values: 10%, -2.566797476249605
adf_result
import plotly.express as px
fig=px.line(df,x=df.index,y=['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3'],title='Air Pollution at Port Harcourt, Nigeria')
fig.show()
Spike in the above graph diminished the other values by Particulate Matter Quantity
fig=px.line(df,x=df.index,y=['Temperature_F','Humidity_%'],title='Air Pollution at Port Harcourt, Nigeria')
fig.show()
df.boxplot(column=['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3'],vert=False)
<AxesSubplot:>
df_by_hour=df.resample('1H').mean()
df_by_hour.dropna(inplace=True)
df_by_hour['Day'],df_by_hour['Month']=df_by_hour.index.day_name(),df_by_hour.index.month_name()
fig = px.line(df_by_hour, x=df_by_hour.index, y='PM2.5_ATM_ug/m3', color='Month')
fig.show()
fig = px.line(df_by_hour, x=df_by_hour.index, y='PM2.5_ATM_ug/m3', color='Day')
fig.show()
df_by_day=df.resample('1D').mean()
df_by_day['Day'],df_by_day['Month']=df_by_day.index.day_name(),df_by_day.index.month_name()
fig = px.line(df_by_day, x=df_by_day.index, y='PM2.5_ATM_ug/m3', color='Month')
fig.show()
fig = px.line(df_by_day, x=df_by_day.index, y='PM2.5_ATM_ug/m3', color='Day')
fig.show()
from statsmodels.tsa.seasonal import seasonal_decompose
analysis = df_by_day[['PM2.5_ATM_ug/m3']].copy()
decompose_result_mult = seasonal_decompose(analysis, model="multiplicative")
trend = decompose_result_mult.trend
seasonal = decompose_result_mult.seasonal
residual = decompose_result_mult.resid
decompose_result_mult.plot();
from statsmodels.tsa.seasonal import seasonal_decompose
analysis = df_by_day[['PM2.5_ATM_ug/m3']].copy()
decompose_result_mult = seasonal_decompose(analysis, model="additive")
trend = decompose_result_mult.trend
seasonal = decompose_result_mult.seasonal
residual = decompose_result_mult.resid
decompose_result_mult.plot();
There is large variation in Particulate matter as compared to other quantity
train_size=int(0.8*len(df))
train_df=df.loc[df.index[:train_size]].copy()
test_df=df.loc[df.index[train_size:]].copy()
valid_size=int(0.2*len(test_df))
valid_df=test_df.loc[test_df.index[:valid_size]]
test_df=test_df.loc[test_df.index[valid_size:]]
scaler=MinMaxScaler()
train_df[['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3']]=scaler.fit_transform(train_df[['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3']])
test_df[['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3']]=scaler.transform(test_df[['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3']])
valid_df[['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3']]=scaler.transform(valid_df[['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3']])
train_df.head(3)
| Temperature_F | Humidity_% | PM2.5_ATM_ug/m3 | |
|---|---|---|---|
| created_at | |||
| 2021-07-26 16:45:59+00:00 | 0.5 | 0.35 | 0.070509 |
| 2021-07-26 16:48:03+00:00 | 0.5 | 0.35 | 0.069293 |
| 2021-07-26 16:49:59+00:00 | 0.5 | 0.35 | 0.065486 |
len(train_df)
44841
class TimeSeries(Dataset):
def __init__(self,df,target,features,sequence_length=48,label_length=7):
self.features=features
self.target=target
self.sequence_length=sequence_length
self.label_length=label_length
self.X=df[features].values
self.y=df[target].values
self.X_,self.y_=self.make_sequence()
def make_sequence(self):
X_=[]
y_=[]
L=len(self.X)
for i in range(L-(self.sequence_length+self.label_length)):
X_.append(self.X[i:i+self.sequence_length])
y_.append(self.y[(i+self.sequence_length):(i+self.sequence_length+self.label_length)])
return torch.tensor(X_).float(),torch.tensor(y_).float()
def __len__(self):
return len(self.X_)
def __getitem__(self,idx):
return self.X_[idx],self.y_[idx]
target='PM2.5_ATM_ug/m3'
features=['Temperature_F','Humidity_%','PM2.5_ATM_ug/m3']
train_ds=TimeSeries(train_df,target,features)
test_ds=TimeSeries(test_df,target,features)
valid_ds=TimeSeries(valid_df,target,features)
train_ds[0][0]
tensor([[0.5000, 0.3500, 0.0705],
[0.5000, 0.3500, 0.0693],
[0.5000, 0.3500, 0.0655],
[0.5000, 0.3500, 0.0571],
[0.5000, 0.3500, 0.0653],
[0.5000, 0.3500, 0.0598],
[0.5000, 0.3667, 0.0583],
[0.5000, 0.3500, 0.0624],
[0.5000, 0.3500, 0.0561],
[0.4737, 0.3500, 0.0561],
[0.4737, 0.3500, 0.0571],
[0.4737, 0.3500, 0.0592],
[0.4737, 0.3667, 0.0681],
[0.4737, 0.3667, 0.0586],
[0.4737, 0.3667, 0.0622],
[0.4737, 0.3667, 0.0598],
[0.4737, 0.3667, 0.0592],
[0.4737, 0.3667, 0.0595],
[0.4737, 0.3833, 0.0641],
[0.4737, 0.3667, 0.0636],
[0.4737, 0.3833, 0.0662],
[0.4737, 0.3833, 0.0691],
[0.4737, 0.3833, 0.0729],
[0.4737, 0.3833, 0.0709],
[0.4737, 0.3833, 0.0636],
[0.4737, 0.3833, 0.0641],
[0.4737, 0.3833, 0.0699],
[0.4474, 0.3833, 0.0720],
[0.4474, 0.3833, 0.0748],
[0.4474, 0.4000, 0.0669],
[0.4474, 0.4000, 0.0707],
[0.4474, 0.4000, 0.0738],
[0.4474, 0.4000, 0.0751],
[0.4474, 0.4000, 0.0717],
[0.4474, 0.4000, 0.0773],
[0.4474, 0.4000, 0.0804],
[0.4474, 0.4000, 0.0833],
[0.4474, 0.4000, 0.0853],
[0.4474, 0.4000, 0.0837],
[0.4474, 0.4000, 0.0861],
[0.4474, 0.4000, 0.0905],
[0.4474, 0.4167, 0.0854],
[0.4474, 0.4167, 0.0888],
[0.4474, 0.4167, 0.0874],
[0.4474, 0.4167, 0.0834],
[0.4474, 0.4167, 0.0840],
[0.4474, 0.4167, 0.0903],
[0.4474, 0.4167, 0.0875]])
train_ds[0][0].shape
torch.Size([48, 3])
train_ds[0][1]
tensor([0.0916, 0.0795, 0.0691, 0.0702, 0.0555, 0.0669, 0.0565])
class RegressionLSTM(nn.Module):
def __init__(self,n_feature,n_hidden):
super(RegressionLSTM,self).__init__()
self.n_feature=n_feature
self.n_hidden=n_hidden
self.lstm=nn.LSTM(input_size=self.n_feature,hidden_size=self.n_hidden,batch_first=True,num_layers=1)
self.linear=nn.Linear(in_features=self.n_hidden,out_features=7)
def forward(self,x):
batch_size = x.shape[0]
h0 = torch.zeros(1, batch_size, self.n_hidden).requires_grad_().to(device)
c0 = torch.zeros(1, batch_size, self.n_hidden).requires_grad_().to(device)
_, (hn, _) = self.lstm(x, (h0, c0))
out = self.linear(hn[0])
return out
model=RegressionLSTM(n_feature=3,n_hidden=10).to(device)
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)
model
RegressionLSTM( (lstm): LSTM(3, 10, batch_first=True) (linear): Linear(in_features=10, out_features=7, bias=True) )
len(train_ds)
44786
train_dl=DataLoader(train_ds,batch_size=64,shuffle=False)
valid_dl=DataLoader(valid_ds,batch_size=64,shuffle=False)
for x,y in train_dl:
print(x.shape)
print(y.shape)
torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([64, 48, 3]) torch.Size([64, 7]) torch.Size([50, 48, 3]) torch.Size([50, 7])
x.shape
torch.Size([50, 48, 3])
loss_function(model(x.to(device)),y.to(device))
tensor(0.0557, device='cuda:0', grad_fn=<MseLossBackward>)
train_losses=[]
val_losses=[]
def running_model(model,train_data,valid_data,n_epochs):
best_loss=float('inf')
model=model.to(device)
for epoch in tqdm(range(1,n_epochs+1)):
print(f'{epoch} Epoch is running')
train_loss=0.0
val_loss=[]
for i,(X,y) in enumerate(train_data):
model.train()
X=Variable(X).to(device)
y=Variable(y).to(device)
output = model(X)
loss = loss_function(output, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss += round(loss.cpu().item(),5)*X.size(0)
if i%100==0 and i>0:
model.eval()
with torch.no_grad():
losses=0.0
for X, y in valid_data:
X=Variable(X).to(device)
y=Variable(y).to(device)
output = model(X)
losses += round(loss_function(output, y).cpu().item(),5)*X.size(0)
val_loss.append(losses/len(valid_data.dataset))
overall_val_loss=sum(val_loss)/len(val_loss)
if overall_val_loss<best_loss:
best_loss=overall_val_loss
torch.save(model.state_dict(),f'model{epoch}.pth')
train_losses.append(train_loss / len(train_data.dataset))
val_losses.append(overall_val_loss)
running_model(model=model,train_data=train_dl,valid_data=valid_dl,n_epochs=50)
1 Epoch is running 2 Epoch is running 3 Epoch is running 4 Epoch is running 5 Epoch is running 6 Epoch is running 7 Epoch is running 8 Epoch is running 9 Epoch is running 10 Epoch is running 11 Epoch is running 12 Epoch is running 13 Epoch is running 14 Epoch is running 15 Epoch is running 16 Epoch is running 17 Epoch is running 18 Epoch is running 19 Epoch is running 20 Epoch is running 21 Epoch is running 22 Epoch is running 23 Epoch is running 24 Epoch is running 25 Epoch is running 26 Epoch is running 27 Epoch is running 28 Epoch is running 29 Epoch is running 30 Epoch is running 31 Epoch is running 32 Epoch is running 33 Epoch is running 34 Epoch is running 35 Epoch is running 36 Epoch is running 37 Epoch is running 38 Epoch is running 39 Epoch is running 40 Epoch is running 41 Epoch is running 42 Epoch is running 43 Epoch is running 44 Epoch is running 45 Epoch is running 46 Epoch is running 47 Epoch is running 48 Epoch is running 49 Epoch is running 50 Epoch is running
plt.title("Training v/s validation loss at each epoch")
plt.plot(np.arange(1,51),train_losses,label='Train',)
plt.plot(np.arange(1,51),val_losses,label='Validation')
plt.xlabel('Number of epochs')
plt.ylabel('Losses')
plt.legend()
<matplotlib.legend.Legend at 0x198979fb4c0>
test_dl=DataLoader(test_ds,batch_size=1,shuffle=False)
test_loss=[]
model.eval()
with torch.no_grad():
losses=0.0
for X, y in test_dl:
X=Variable(X).to(device)
y=Variable(y).to(device)
output = model(X)
losses += round(loss_function(output, y).cpu().item(),5)
test_loss.append(losses/len(test_dl))
print(f' Overall Test loss :{np.mean(test_loss)}')
Overall Test loss :0.00283036010769576
y.shape
torch.Size([1, 7])
x.shape
torch.Size([50, 48, 3])
df.loc[test_df.index[0]:test_df.index[47]].values.shape
(48, 3)
df.loc[test_df.index[48]:test_df.index[54]].values.shape
(7, 3)
new_df=df.copy()
new_df.loc[:,'PM2.5_Predicted']=0
new_df.head(5)
| Temperature_F | Humidity_% | PM2.5_ATM_ug/m3 | PM2.5_Predicted | |
|---|---|---|---|---|
| created_at | ||||
| 2021-07-26 16:45:59+00:00 | 89 | 50 | 40.78 | 0 |
| 2021-07-26 16:48:03+00:00 | 89 | 50 | 40.09 | 0 |
| 2021-07-26 16:49:59+00:00 | 89 | 50 | 37.93 | 0 |
| 2021-07-26 16:54:03+00:00 | 89 | 50 | 33.18 | 0 |
| 2021-07-26 16:55:59+00:00 | 89 | 50 | 37.84 | 0 |
for i in range(len(df)-55):
X=new_df.loc[new_df.index[i]:new_df.index[i+47],features].values
X=scaler.transform(X)
X=torch.tensor(X).float().unsqueeze(0).to(device)
pred=model(X)
new_df.loc[new_df.index[i+48]:new_df.index[i+47+7],'PM2.5_Predicted']=pred.view(-1).detach().cpu().numpy()
def inverse_PM(x):
return x*(scaler.data_max_[2]-scaler.data_min_[2])+scaler.data_min_[2]
new_df.loc[:,'PM2.5_Predicted']=new_df.loc[:,'PM2.5_Predicted'].apply(inverse_PM)
new_df.tail(8)
| Temperature_F | Humidity_% | PM2.5_ATM_ug/m3 | PM2.5_Predicted | |
|---|---|---|---|---|
| created_at | ||||
| 2021-10-25 09:22:42+00:00 | 87 | 61 | 28.71 | 27.200236 |
| 2021-10-25 09:24:44+00:00 | 87 | 61 | 31.04 | 39.695680 |
| 2021-10-25 09:26:47+00:00 | 87 | 61 | 28.90 | 31.618256 |
| 2021-10-25 09:28:43+00:00 | 87 | 61 | 29.17 | 36.580820 |
| 2021-10-25 09:30:43+00:00 | 87 | 61 | 29.57 | 37.132174 |
| 2021-10-25 09:32:44+00:00 | 87 | 61 | 28.75 | 43.939090 |
| 2021-10-25 09:34:44+00:00 | 87 | 61 | 29.97 | 56.937708 |
| 2021-10-25 09:36:44+00:00 | 87 | 60 | 30.25 | 0.780000 |
fig=px.line(new_df,x=new_df.index,y=['PM2.5_ATM_ug/m3','PM2.5_Predicted'],title='Air Pollution at Port Harcourt, Nigeria')
fig.show()
import gc
gc.collect()
torch.cuda.empty_cache()
Save MinMax scaler for another report
import joblib
joblib.dump(scaler, 'scaler.gz')
#my_scaler = joblib.load('scaler.gz')
['scaler.gz']